using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;
using HashTable = ExitGames.Client.Photon.Hashtable;

public class CharacterSelectManager : MonoBehaviourPunCallbacks
{
    #region 单例模式
    public static CharacterSelectManager Instance;

    void Awake()
    {
        Instance = this;
    }
    #endregion

    // 当前角色卡池中角色的剩余数量
    public int currCharacterCount = 6;

    // 当前玩家可以选择的角色数量
    public int charPlayerCanSelect = 0;

    // 是否禁止对方行动，用来卡住对方不让对方动
    private bool isBanning = true;

    // 选择角色的按钮
    public Button selectButton;

    private void Start()
    {
        charSelectTable.Add("IsWaitingOther", isBanning);

        for (int i = 0; i < 3; i++)     // 给玩家分配随机三个角色
        {
            if (PhotonNetwork.IsMasterClient)
            {
                GameManager.Instance.red_CharCards.Add(RoundManager.Instance.charCards[i]);
            }
            else
            {
                GameManager.Instance.blue_CharCards.Add(RoundManager.Instance.charCards[i+3]);
            }
        }
        for (int i = 6; i < 12; i++)    // 剩下的放到池子里供玩家选择
        {
            GameManager.Instance.Pool_CharCards.Add(RoundManager.Instance.charCards[i]);
        }

    }

    #region 网络相关

    // 创建一个哈希表保存自定义属性，用来管理玩家在角色选择环节中的各种属性
    HashTable charSelectTable = new HashTable();

    public override void OnPlayerPropertiesUpdate(Photon.Realtime.Player targetPlayer, HashTable changedProps)  // 自定义属性的回调方法
    {
        if (targetPlayer != PhotonNetwork.LocalPlayer)  // 更新对方的数据（注意不是更新自己的而是对方的！！）
        {
            isBanning = !(bool)changedProps["IsWaitingOther"];
        }
    }
    #endregion


    #region 流程控制（主逻辑）
    /// <summary>
    /// 进入选角色环节，先进行一下初始化
    /// </summary>
    public IEnumerator EnterCharacterSelect()
    {
        if (PhotonNetwork.LocalPlayer.IsMasterClient)
        {
            charPlayerCanSelect = 1;    // 房主（红方）先选1个
            isBanning = true;
        }
        else
        {
            charPlayerCanSelect = 0;    // 蓝方先不能选
            isBanning = false;
        }
        yield return StartCoroutine(UpdateRound());
    }

    private IEnumerator UpdateRound()
    {
        while (currCharacterCount != 0) // 检查一下当前的剩余角色是否为0
        {
            PhotonNetwork.LocalPlayer.SetCustomProperties(charSelectTable);


            #region 特殊情况：红方第一次选择与蓝方最后一次选择
            if (currCharacterCount == 1)    //若卡池最后剩余一个角色，则分配给蓝方
            {
                if (!PhotonNetwork.IsMasterClient)
                {
                    selectButton.gameObject.SetActive(true);
                    yield return StartCoroutine(SelectFunc());
                }
            }
            if (charPlayerCanSelect == 1)   //第一次红方只有一次选择机会
            {
                yield return StartCoroutine(SelectFunc());
            }
            #endregion


            if (charPlayerCanSelect == 0)   // 玩家当前的可选角色数量为0后，轮到对方来选，卡住玩家的进程
            {
                yield return StartCoroutine(OtherTurnToSelect());
            }

            yield return StartCoroutine(MyTurnToSelect());   // 玩家还有可选角色数量，进入选择环节
        }

        yield return null;
        // 选完角色后进入游戏主场景
        PhotonNetwork.LoadLevel(2);
        GameManager.Instance.GameState = GameState.Start;
    }

    /// <summary>
    /// 轮到自己来选了
    /// </summary>
    private IEnumerator MyTurnToSelect()
    {
        selectButton.gameObject.SetActive(true);    // 轮到自己来选角色了，打开选择按钮
        charPlayerCanSelect = 2;         // 获得两次选择角色的机会


        yield return StartCoroutine(SelectFunc());
    }

    /// <summary>
    /// 轮到对方选了，自己不能动
    /// </summary>
    private IEnumerator OtherTurnToSelect()
    {
        selectButton.gameObject.SetActive(false);   // 不显示选角色按钮
        while (!isBanning)
        {
            yield return null;
        }
    }

    /// <summary>
    /// 选择角色的常规操作
    /// </summary>
    private IEnumerator SelectFunc()
    {
        while (charPlayerCanSelect != 0)
        {
            // 等待玩家点击确认按钮
            yield return null;
        }

        isBanning = false;
        charSelectTable["IsWaitingOther"] = isBanning;
        PhotonNetwork.LocalPlayer.SetCustomProperties(charSelectTable);
    }
    #endregion




}
